{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建示例数据\n",
    "X = np.array([[1, 4], [2, 5], [3, 2], [4, 2], [5, 1]])  # 电影A和电影B的评分 #TODO\n",
    "y = np.array([0, 0, 1, 1, 1])  # 0表示动作片，1表示喜剧片 #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1) #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)  # TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user) #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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FZfk5ORU6ojQnTt34OTkpLK9VCqFVFr6ULqlpaXOvpC67Ls6MPX8ANPP0RTy8wgfgrRFq6Hqr0jJk3xIHv/vL1RzM9Tr1RUOTT30GZ7OmcIYNh71fzg34fNSVw4Cz4yhRILG4YNhZWWl5wh1xxTGryLazlEfn5dBJ1oLITBmzBhs2rQJe/bsKfNJxSX5+flh9+7dSssSEhLg5+enqzCJqBqy92qChqFBgIrHPyhIJJCYmaH5jI/0FxipzW3EQNg2di13wrzEwhw27i5wHfGGHiOj55VBiyJ1nlQ8fPhwTJ06VfF+7Nix2L59OxYuXIi///4bkZGROH78OMaMGWOIFIjIgNos/QxOQb0BoPRfrGZmMJNaof36xajdueznYJHhWNjbofOOmH9Pa5qVOO73vz/bNHJBl52rYVnT3gAR0vPGoEWROk8qTktLQ3p6uuJ9165dERsbix9//BFt27bF+vXrsXnzZrRu3doQKRCRAZlLreD76zfoFL8C9fu+DHPbood3Wjs7otmnH6Dn3wlo0L+HYYOkctl6uOLlk1vg/eMcOHh7QWJVdIrEoWVztFn6GV5O/h22jdV/VAtRVRh0TpE6F74lJiaWWjZo0CAMGjRIBxERkbGRSCSo7/8i6vu/CJlMhvj4eHQ/s83k52uYEnNbG7i9/Sbc3n5TMYZ++2I5hqR3fPYZEREREVgUEREREQFgUUREREQEgEUREREREQAWRUREREQAWBQRERERAWBRRERERASARRERERERABZFRERERABYFBEREREBYFFEREREBIBFEREREREAFkVEREREAFgUEREREQFgUUREREQEgEUREREREQAWRUREREQAWBQRERERAWBRRERERASARRERERERABZFRERERABYFBEREREBYFFEREREBIBFEREREREAFkVEREREAFgUEREREQFgUUREREQEgEUREREREQAWRUREREQAWBQRERERAWBRRERERATAwEXR/v378dprr8HFxQUSiQSbN28ut31iYiIkEkmpV0ZGhn4CJiIiIpNl0KLo0aNHaNu2LRYvXqzRdhcuXEB6erri5ejoqKMIiYiI6HlhYcid9+vXD/369dN4O0dHR9SqVUv7AREREdFzy6BFUWW1a9cO+fn5aN26NSIjI9GtW7cy2+bn5yM/P1/xPjs7GwAgk8kgk8m0Gldxf9rut7ow9fwA08+R+Rk/U8+R+Rk/XeWoj89MIoQQOt+LGiQSCTZt2oTg4OAy21y4cAGJiYno0KED8vPzsXz5cvz00084evQofH19VW4TGRmJqKioUstjY2Nha2urrfCJiIhIh/Ly8jB06FBkZWXBwcFBJ/swqqJIle7du6NRo0b46aefVK5XdaTIzc0N9+7d0/qHKpPJkJCQAH9/f1haWmq17+rA1PMDTD9H5mf8TD1H5mf8dJVjdnY26tWrp9OiyChPn5XUqVMnHDx4sMz1UqkUUqm01HJLS0udfSF12Xd1YOr5AaafI/MzfqaeI/MzftrOUR+fl9HfpyglJQXOzs6GDoOIiIiMnEGPFOXm5uLy5cuK99euXUNKSgrq1KmDRo0aYerUqbh16xb++9//AgC+/vprNG7cGK1atcKTJ0+wfPly7NmzBzt37jRUCkRERGQiDFoUHT9+HD179lS8Hz9+PAAgLCwMMTExSE9PR1pammJ9QUEBJkyYgFu3bsHW1hbe3t7YtWuXUh9ERERElWHQoqhHjx4ob553TEyM0vvJkydj8uTJOo6KiIiInkdGP6eIiIiISBtYFBERERGBRRERERERABZFRERERABYFBEREREBYFFEREREBIBFEREREREAFkVEREREAFgUEREREQFgUUREREQEgEUREREREQAWRUREREQAWBQRERERAWBRRERERASARRERERERABZFRERERABYFBEREZGO3L9/H46OjkhNTdX7vrt06YINGzZotA2LIiIiItKJOXPmICgoCB4eHoplEomk1CsuLk6jfvfv34/XXnsNLi4ukEgk2Lx5c6k206dPx5QpUyCXy9Xul0URERERaV1eXh5WrFiB8PDwUutWrVqF9PR0xSs4OFijvh89eoS2bdti8eLFZbbp168fcnJysG3bNrX7tdAoCiIiIiI1bNu2DVKpFF26dCm1rlatWnBycqp03/369UO/fv3KbWNubo7+/fsjLi4OgYGBavXLI0VERESkdYcOHUL79u1VrouIiEC9evXQqVMnrFy5EkIIncTQqVMnHDhwQO32PFJEREREWnf9+nW4uLiUWj5r1iy88sorsLW1xc6dO/HBBx8gNzcXH330kdZjcHFxwY0bNyCXy2FmVvFxIBZFREREpHVPnjyBtbV1qeX/+c9/FH/28fHBo0ePsGDBAp0URTY2NpDL5cjP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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', s=60) #TODO\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=10) #TODO\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user) #TODO\n",
    "nearest = X[idx[0][0]] #TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--') #TODO\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
